package com.baidu.ai.aip.faceDatabase;

import com.baidu.ai.aip.auth.AuthService;
import com.baidu.ai.aip.utils.Base64Util;
import com.baidu.ai.aip.utils.FileUtil;
import com.baidu.ai.aip.utils.HttpUtil;
import com.baidu.ai.aip.utils.GsonUtils;

import java.io.IOException;
import java.util.*;

/**
 * 人脸更新
 */
public class FaceUpdate {

    /**
     * 重要提示代码中所需工具类
     * FileUtil,Base64Util,HttpUtil,GsonUtils请从
     * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
     * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
     * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
     * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
     * 下载
     */
    public static String faceUpdate(String img, String groupId, String userId,String userInfo) {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/update";
        try {
            Map<String, Object> map = new HashMap<>();
            /**
             * string	图片信息(总数据大小应小于10M)，图片上传方式根据image_type来判断
             */
            map.put("image", img);



            /**
             * 用户组id，标识一组用户（由数字、字母、下划线组成），长度限制128B
             */
            map.put("group_id", "group_repeat");


            /**
             * 用户id（由数字、字母、下划线组成），长度限制48B，注意无法使用中文
             */
            map.put("user_id", "0_chaoyue2");

            /**
             * 用户资料，长度限制48B 默认空
             */
            map.put("user_info", "abc");

            /**
             * 图片类型
             * BASE64:图片的base64值，base64编码后的图片数据，编码后的图片大小不超过2M；
             * URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长)；
             * FACE_TOKEN: 人脸图片的唯一标识
             */
            map.put("image_type", "BASE64");

            /**
             * 图片质量控制
             * NONE: 不进行控制
             * LOW:较低的质量要求
             * NORMAL: 一般的质量要求
             * HIGH: 较高的质量要求
             * 默认 NONE
             * 若图片质量不满足要求，则返回结果中会提示质量检测失败
             */
            map.put("quality_control", "LOW");

            /**
             * 活体检测控制
             * NONE: 不进行控制
             * LOW:较低的活体要求(高通过率 低攻击拒绝率)
             * NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
             * HIGH: 较高的活体要求(高攻击拒绝率 低通过率)
             * 默认NONE
             * 若活体检测结果不满足要求，则返回结果中会提示活体检测失败
             */
            map.put("liveness_control", "NONE");

            /**
             * 操作方式
             * UPDATE: 会使用新图替换库中该user_id下所有图片, 若user_id不存在则会报错
             * REPLACE : 当user_id不存在时, 则会注册这个user_id的用户
             * 默认使用UPDATE
             */

            /**
             * 操作方式
             * UPDATE: 会使用新图替换库中该user_id下所有图片, 若user_id不存在则会报错
             * REPLACE : 当user_id不存在时, 则会注册这个user_id的用户
             * 默认使用UPDATE
             */
            map.put("action_type", "REPLACE");

            String param = GsonUtils.toJson(map);

            // 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
            String accessToken = AuthService.getAccess_token();

            String result = HttpUtil.post(url, accessToken, "application/json", param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) throws IOException {
        String img = "C:\\Users\\yej\\Desktop\\cy.png";
        byte[] imgData = FileUtil.readFileByBytes(img);
        String image = Base64Util.encode(imgData);
        faceUpdate(image,"test","ycmm","更新测试");
    }
}